在做App时遇到这么一个需求:要求App在启动的时候检测当前运行设备是否为虚拟设备,如果为虚拟设备则App停止运行并退出。通过网络上搜集的资料,总结了以下检测方法。
基于固定数据检测
虚拟机设备的ID、IMID一般都为固定值,检测到这些信息为默认值即可判定为虚拟设备。
1 | private static String[] imeis = {"000000000000000"}; |
除了以上数据检测外,还可以检测设备的默认手机号码,下面是网上给出的默认手机号码(不推荐这种方法,这些手机号码有可能是真实的):
1 | private static String[] known_numbers = { "15555215554", "15555215556", |
以上通过系统API获取并不准确,毕竟可以通过修改源码或者通过攻击修改信息。
基于硬件信息检测
通过检测设备的手机型号,可以简单判断设备是否为虚拟设备。如Google官方虚拟机的设备型号为google_sdk或sdk。
1 | private static boolean checkEmulatorBuild() { |
除了检测手机型号外,还可以检测下真机独有的硬件设备,如GPS、蓝牙、温度传感器等。
虚拟设备特有文件
1 | private static String[] known_files = {"/system/lib/libc_malloc_debug_qemu.so","/sys/qemu_trace","/system/bin/qemu-props"}; |
虚拟机驱动文件检测
1 | private static String[] known_qemu_drivers = {"goldfish"}; |
以上方法可以检测出大部分的虚拟设备,但并不是万能的,需要根据不同场景组合不同的方法组合进行判定。